<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<title>正则表达式</title>
</head>

<body>
	正则表达式，要么匹配字符，要么匹配位置。
	先找位置，后匹配字符
	<script>

		/* 
			1.选择符： |
			注：左右两侧有一个匹配到就可以。
		*/
		let xuanzhefu = "houdunren";
		console.log("选择符：" + /houdunren|hdcms/.test(xuanzhefu));//true

		/* 
			2.字符转义： \
		*/
		const url = "https://www.houdunren.com";
		console.log("字符转义:" + /https:\/\//.test(url));//true

		// 3.找数字
		let hd3 = "hd2875fbwui2398";
		//match就是把匹配的字符串提取出来
		console.log(hd3.match(/\d/g).join(""));//28752398

		// 4.对象形式创建正则表达式
		let hd4 = "houdunren.com";
		let a4 = "u";
		let reg4 = new RegExp(a4, "g");
		console.log("4:" + reg4.test(hd4));//true


		//5.原子字符
		/* 
		元字符	说明	示例
		\d	匹配任意一个数字	[0-9]
		\D	与除了数字以外的任何一个字符匹配	[^0-9]
		\w	与任意一个英文字母,数字或下划线匹配	[a-zA-Z_]
		\W	除了字母,数字或下划线外与任何字符匹配	[^a-zA-Z_]
		\s	任意一个空白字符匹配，如空格，制表符\t，换行符\n	[\n\f\r\t\v]
		\S	除了空白符外任意一个字符匹配	[^\n\f\r\t\v]
		.	匹配除换行符外的任意字符	
		*/

		let reg1 = "houdunren 2010";
		console.log("1:" + reg1.match(/\d/g)); //["2", "0", "1", "0"]

		// `\d`,`\D`,`\s`,`\S`,`\w`,`\W`的使用
		var reg2 = /\D\d/g; // 全局匹配。匹配一个非数字与一个数字。两者紧靠在一起  注意顺序
		var text2 = "abcd1234";
		var res2 = text2.match(reg2);
		console.log("2:" + res2); // ["d1"]

		var reg3 = /\D\s\w\d/g; // 全局匹配。注意顺序  注意大小写
		var text3 = "abcd1234";
		var text4 = "abcd _1234";
		var res3 = text3.match(reg3);
		var res4 = text4.match(reg3);
		console.log("3:" + res3); // null
		console.log("4:" + res4); // ["d _1"]

		//6.重复匹配
		/*
			符号	说明
			*       重复零次或更多次
			+		重复一次或更多次
			?		重复零次或一次
			{n}		重复n次
			{n,}	重复n次或更多次
			{n,m}	重复n到m次
		*/
		/*
			这里涉及到一个贪婪匹配与非贪婪匹配。
			贪婪匹配指的是使用以上量词的时候会按照最大次数进行匹配。
			非贪婪匹配则是按最小次数进行匹配。使用非贪婪匹配只需在两次后面加上一个?
		*/

		//7.题目：数字的千分位分割法
		//将123456789转化为123,456,789
		let price = '123456789'
		let priceReg = /(?!^)(?=(\d{3})+$)/g
		console.log(price.replace(priceReg, ','))//123,456,789

		//8.手机号3-4-4分割
		//将手机号18379836654转化为183-7983-6654
		let mobie='18274090332'
		let mobieReg=/(?=(\d{4})+$)/g
		console.log(mobie.replace(mobieReg,'-'));

		//9.断言匹配
		/*
			(?=exp) 匹配后面为exp的前面的内容，也即exp前面那个位置
			(?<=exp) 匹配前面为exp的后面的内容，也即exp后面那个位置
			(?!exp) 后面不能出现exp指定内容
			(?<!exp) 前面不能出现exp指定内容
		*/

		let expE='2368ghaaUI58vnwe99333';
		//匹配后面为aa的前面的3个字符
		let expe1=/\w{3}(?=aa)/i;
		//字符方法前面放字符表达式，里面放正则表达式。正则方法则相反
		console.log(expE.match(expe1));//8gh

		//匹配前面是aa的后面的两个字符
		let expe2=/(?<=aa)\w{2}/i;
		console.log(expE.match(expe2));//UI

		//(?!exp) 236后面不能出现指定内容8
		let expe3=/^\w{3}(?!8)/i;
		console.log(expe3.test(expE));//出现了，所以为false

		//(?<!exp) 字符前面不出现数字的内容
		let expe4=/(?<!\d+)[a-z]+/i;
		console.log(expE.match(expe4));//出现了，所以为false




	</script>
</body>

</html>